package com.h819.core.net;

import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName: IPUtils
 * @Description: TODO(IP地址相关的工具类，封装常用的IP工具方法)
 * @author h819
 * @date Sep 7, 2009 10:51:30 PM
 * @version V1.0
 */
public class IPUtils {
	/**
	 * 非法IP地址常量。
	 * 
	 * @since 0.12
	 */
	public static final String INVALID_IP = "0.0.0.0";
	/**
	 * 未知主机名常量。
	 * 
	 * @since 0.12
	 */
	public static final String UNKNOWN_HOST = "";

	/**
	 * 私有构造方法，防止类的实例化，因为工具类不需要实例化。
	 */
	private IPUtils() {
	}

	/**
	 * 根据主机名得到IP地址字符串。
	 * 
	 * @param hostName
	 *            要查找地址的主机名
	 * @return 对应主机的IP地址，主机名未知或者非法时返回INVALID_IP。
	 */
	public static String getByName(String hostName) {
		try {
			InetAddress inet = InetAddress.getByName(hostName);
			return inet.getHostAddress();
		} catch (UnknownHostException e) {
			return INVALID_IP;
		}
	}

	/**
	 * 获取客户端 ip
	 * 
	 * @param request
	 * @return
	 */
	public String getIpAddrByRequest(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;

		/**
		 * jsp 中，根据ip地址跳转
		 * */
		// String ipD = ip.split("\\.")[0];//获取 ip 地址第一位
		//
		// if(ipD.equals("129")){
		// response.sendRedirect("http://129.9.100.10/innerApp");
		// }else{
		// response.sendRedirect("http://202.106.162.203/innerApp");
		// }

	}

	/**
	 * 根据IP地址得到主机名。
	 * 
	 * @param ip
	 *            要查找主界面的IP地址
	 * @return 对应IP的主机名，IP地址未知时返回UNKNOWN_HOST，IP地址未知也可能是网络问题造成的。
	 */
	public static String getHostName(String ip) {
		try {
			InetAddress inet = InetAddress.getByName(ip);
			return inet.getHostName();
		} catch (UnknownHostException e) {
			return UNKNOWN_HOST;
		}
	}
}
